「在我電腦上跑是正常的」
「datetime.now() 跟 utcnow(),想想看」
阿姨以前在某間電商工作,某位同事接了「每日結帳報表」的需求,他在 Code 裡面直接下了datetime.today() 來抓當天的日期去撈資料庫。在 Local 端測試,報表完美產出,QA 在台灣的測試機驗證也全數通過。
結果一推上 Production,因為雲端伺服器預設的系統時區是 UTC,比台灣慢了八個小時。台灣時間早上八點,系統以為現在還是昨天的半夜十二點。這導致所有的報表抓錯區間,金流對帳單全部爛掉,財務部一早上班看到帳對不起來,直接拉 P0 警報把所有人叫起來通靈。
這叫做「基準線偏移(Baseline Drift)」。當你的各個零件沒有對齊同一套度量衡,組裝起來的產品就是個隨時會解體的垃圾。
面對時區這個地雷,絕對不能相信工程師的「自覺」,我們必須用強制手段把所有時間操作規範在 UTC 基準線上。
2.基礎架構的三位一體防禦,在架構設計上,確立不可動搖的時區紀律:
Database:所有時間欄位一律使用 TIMESTAMP WITH TIME ZONE,絕不允許存入單純的字串。
Backend:所有 API 吐出去的 JSON 時間格式,強制符合 ISO-8601 並帶上 Z(UTC 標記)。
Frontend:後端只負責給 UTC,前端自己抓使用者的瀏覽器時區去轉換顯示。後端絕不插手 Local Time 轉換